Problem
【FJ2015集训】卡牌配对
Description
现在有一种卡牌游戏,每张卡牌上有三个属性值:。把卡牌分为两类,分别有张。
两张卡牌能够配对,当且仅当,存在至多一项属性值使得两张卡牌该项属性值互质,且两张卡牌类别不同。
比如一张类卡牌属性值分别是,一张类卡牌属性值分别为。那么这两张牌是可以配对的,因为只有和一组属性互质。
游戏的目的是最大化匹配上的卡牌组数,当然每张卡牌只能用一次。
Input
数据第一行两个数,,空格分割。
接下来行,每行个数,依次表示每张类卡牌的项属性值。
接下来行,每行个数,依次表示每张类卡牌的项属性值。
Output
Sample Input
1 | 2 2 |
Sample Output
1 | 2 |
HINT
样例中第一张类卡牌和第一张类卡牌能配对,第二张类卡牌和两张类卡牌都能配对。所以最佳方案是第一张和第一张配对,第二张和第二张配对。
对于的数据,,属性值为不超过的正整数
请大胆使用渐进复杂度较高的算法!
标签:网络流
Solution
非常巧妙的一道二分图建模
首先考虑暴力建边,显然边数是 级别的,会同时和
注意到值域只有,可以预处理出所有质数,并且可以发现可匹配的情况只有三种,即不互质,不互质,不互质(这里不互质只两张卡的两种同样属性不互质)。这样总共的不互质即可以匹配的情况共有种(内共个质数)
对于一张类卡牌,如果一个点,是的质因子,是的质因子,那么就连一条由卡牌出发到那个点的流量为的边。其他类的类似。类卡牌的话就连一条点到卡牌的边。源点向每个牌连一条流量为的边,每个牌向汇点连一条流量为的边。构图后跑最大流即可。
Code
1 |
|